package com.usian.ai.common;

import com.usian.ai.common.enums.ResultCodeEnum;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;

import java.io.Serializable;

/**
 * Result类用于统一封装操作的返回结果，包含响应码、消息以及相关数据
 * 通用返回结果类，用于封装接口返回数据
 * 提供了一系列静态方法来创建成功或失败的返回结果对象
 * @author liqiang
 */
@Data
@ToString
@NoArgsConstructor
public class Result<T> implements Serializable {

    private static final long serialVersionUID = 1L;


    /**
     * 响应码
     */
    private Integer code;

    /**
     * 消息
     */
    private String msg;

    /**
     * 数据，使用泛型以便可以存放不同类型的数据
     */
    private T data;



    /**
     * 私有构造方法，用于内部创建Result对象，控制对象的创建逻辑
     * @param code
     * @param msg
     * @param data
     */
    private Result(Integer code, String msg, T data) {
        this.code = code;
        this.msg = msg;
        this.data = data;
    }



    /**
     * 创建成功的返回结果，仅包含成功状态码和消息，无具体数据返回的情况
     *
     * @return Result对象，表示成功
     */
    public static <T> Result<T> ok() {
        return new Result<>(ResultCodeEnum.SUCCESS.getCode(), ResultCodeEnum.SUCCESS.getMessage(), null);
    }

    /**
     * 创建成功的返回结果，包含成功时返回的数据
     *
     * @param data 成功时返回的数据
     * @return Result对象，表示成功
     */
    public static <T> Result<T> ok(T data) {
        return new Result<>(ResultCodeEnum.SUCCESS.getCode(), ResultCodeEnum.SUCCESS.getMessage(), data);
    }

    /**
     * 创建成功的返回结果，包含自定义的成功状态码和消息，无具体数据返回的情况
     *
     * @param resultCodeEnum 成功状态码枚举
     * @return Result对象，表示成功
     */
    public static <T> Result<T> ok(ResultCodeEnum resultCodeEnum) {
        return new Result<>(resultCodeEnum.getCode(), resultCodeEnum.getMessage(), null);
    }

    /**
     * 创建成功的返回结果，包含自定义的成功状态码和消息以及相应的数据
     *
     * @param resultCodeEnum 成功状态码枚举
     * @param data           成功时返回的数据
     * @return Result对象，表示成功
     */
    public static <T> Result<T> ok(ResultCodeEnum resultCodeEnum, T data) {
        return new Result<>(resultCodeEnum.getCode(), resultCodeEnum.getMessage(), data);
    }

    /**
     * 创建失败的返回结果，不包含任何数据，使用默认的失败状态码和消息
     *
     * @return Result对象，表示失败
     */
    public static <T> Result<T> fail() {
        return new Result<>(ResultCodeEnum.FAIL.getCode(), ResultCodeEnum.FAIL.getMessage(), null);
    }

    /**
     * 创建失败的返回结果，包含失败时的数据，使用默认的失败状态码和消息
     *
     * @param data 失败时返回的数据
     * @return Result对象，表示失败
     */
    public static <T> Result<T> fail(T data) {
        return new Result<>(ResultCodeEnum.FAIL.getCode(), ResultCodeEnum.FAIL.getMessage(), data);
    }

    /**
     * 创建失败的返回结果，包含自定义的失败状态码和消息，无具体数据返回的情况
     *
     * @param resultCodeEnum 失败状态码枚举
     * @return Result对象，表示失败
     */
    public static <T> Result<T> fail(ResultCodeEnum resultCodeEnum) {
        return new Result<>(resultCodeEnum.getCode(), resultCodeEnum.getMessage(), null);
    }

    /**
     * 创建失败的返回结果，包含自定义的失败状态码和消息以及相应的数据
     *
     * @param resultCodeEnum 失败状态码枚举
     * @param data           失败时返回的数据
     * @return Result对象，表示失败
     */
    public static <T> Result<T> fail(ResultCodeEnum resultCodeEnum, T data) {
        return new Result<>(resultCodeEnum.getCode(), resultCodeEnum.getMessage(), data);
    }
}
